package gotinit

import (
	"errors"
	"log"
	"os"
	"strings"

	"gitee.com/tommickey/gose/v3/gose/gotconst"
)

var (
	BasePath           string                  // 定义项目的根目录
	EventDestroyPrefix = "Destroy_"            //  程序退出时需要销毁的事件前缀
	ConfigKeyPrefix    = "Config_"             //  配置文件键值缓存时，键的前缀
	DateFormat         = "2006-01-02 15:04:05" //  配置文件键值缓存时，键的前缀

	// LogLevel 全局日志级别	//ZapLog *zap.Logger
	LogLevel = gotconst.LogDebug //从配置文件中获取Log级别

	//

)

func init1() {
	// 1. 初始化 项目根路径 BasePath
	if curPath, err := os.Getwd(); err == nil {
		// 路径进行处理，兼容单元测试程序程序启动时的奇怪路径
		if len(os.Args) > 1 && strings.HasPrefix(os.Args[1], "-test") {
			BasePath = strings.Replace(strings.Replace(curPath, `\test`, "", 1), `/test`, "", 1)
		} else {
			BasePath = curPath
		}
	} else {
		log.Fatal(errors.New("初始化项目根目录失败"))
	}
}

func init2() {
	// 1. 初始化 项目根路径 在01gotconst.go里

	//2.检查配置文件以及日志目录等非编译性的必要条件
	checkRequiredFolders()

	//3.初始化表单参数验证器，注册在容器（Web、Api共用容器）
	//register_validator.WebRegisterValidator()
	//register_validator.ApiRegisterValidator()

	// 5.初始化全局日志句柄，并载入日志钩子处理函数
	//ZapLog = zap_factory.CreateZapFactory(sys_log_hook.ZapLogHandler)

	// 7.雪花算法全局变量
	//SnowFlake = snow_flake.CreateSnowflakeFactory()

}

// 检查项目必须的非编译目录是否存在，避免编译后调用的时候缺失相关目录
func checkRequiredFolders() {
	//1.检查配置文件是否存在
	if _, err := os.Stat(BasePath + "/config/config.yml"); err != nil {
		log.Fatal(gotconst.ErrorsConfigYamlNotExists + err.Error())
	}
	if _, err := os.Stat(BasePath + "/config/gorm_v2.ymlbak"); err != nil {
		log.Fatal(gotconst.ErrorsConfigGormNotExists + err.Error())
	}
	//2.检查public目录是否存在
	if _, err := os.Stat(BasePath + "/public/"); err != nil {
		log.Fatal(gotconst.ErrorsPublicNotExists + err.Error())
	}
	/*	//3.检查storage/logs 目录是否存在
		if _, err := os.Stat(BasePath + "/storage/logs/"); err != nil {
			log.Fatal(gotconst.ErrorsStorageLogsNotExists + err.Error())
		}
		// 4.自动创建软连接、更好的管理静态资源
		if _, err := os.Stat(BasePath + "/public/storage"); err == nil {
			if err = os.Remove(BasePath + "/public/storage"); err != nil {
				log.Fatal(gotconst.ErrorsSoftLinkDeleteFail + err.Error())
			}
		}*/
	// 5.
	//if err := os.Symlink(BasePath+"/storage/app", BasePath+"/public/storage"); err != nil {
	//	log.Fatal(ErrorsSoftLinkCreateFail + err.Error())
	//}
}
